package com.xuzz.study.spring.bean.lifecyle;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;

/**
 * BeanFactoryPostProcessor可以对bean的定义（配置元数据）进行处理。
 * 也就是说，Spring IoC容器允许BeanFactoryPostProcessor在容器实际实例化任何其它的bean之前读取配置元数据，并有可能修改它。 *
 * 如果你愿意，你可以配置多个BeanFactoryPostProcessor。你还能通过设置'order'属性来控制BeanFactoryPostProcessor的执行次序。
 * (大概可以这样理解:Spring容器加载了bean的定义文件之后，在bean实例化之前执行的)
 *
 *
 * 在refresh方法的postProcessBeanFactory(beanFactory);这一步执行
 */

public class ExampleBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public ExampleBeanFactoryPostProcessor(){
        super();
        System.out.println("【ExampleBeanFactoryPostProcessor】的构造函数执行");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory
                                               configurableListableBeanFactory) throws BeansException {
        BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("exampleBean");
        PropertyValue[]pvs = bd.getPropertyValues().getPropertyValues();
        String aa = "";
        for(PropertyValue pv:pvs) {
            aa += pv.getName()+"="+pv.getValue();
        }
        System.out.println("【ExampleBeanFactoryPostProcessor】修改前的属性"+aa);

        bd.getPropertyValues().addPropertyValue(new PropertyValue("desc","这是在ExampleBeanFactoryPostProcessor中设置的属性描述"));

        System.out.println("【ExampleBeanFactoryPostProcessor】的postProcessBeanFactory执行");

    }
}
